import base64
import pickle
from django_redis import get_redis_connection


def merge_cookie_cart_to_redis(request, user, response):
    '''  登录用户时将cookie购物车记录合并到登录用户redis中'''

    # 1. 获取cookie中的数据
    cookie_cart = request.COOKIES.get('cart')

    # 判断cookie中是否有数据
    if not cookie_cart:
        return

    cart_dict = pickle.loads(base64.b64decode(cookie_cart))
    # 判断解析cookie中数据后是否为空字典
    if not cart_dict:
        return

        # 2. 组织数据

    # 利用字典保存cookie中记录添加商品的id和对于数量  字典中键值作为属性和值合并到redis中
    cart = {}
    # 记录redis勾选状态中应该增加的sku_id
    redis_cart_selected_add = []
    # 记录redis勾选状态中应该删除的sku_id
    redis_cart_selected_remove = []

    # 利用两个列表 分别保存 被勾选和未被勾选的 商品id
    print(cart_dict)
    for sku_id, selected_count in cart_dict.items():
        cart[sku_id] = selected_count['count']

        if selected_count['selected']:
            redis_cart_selected_add.append(sku_id)
        else:
            redis_cart_selected_remove.append(sku_id)

        # 3. 进行合并操作
        # 字典中键值作为属性和值合并到redis中  ---冲突覆盖没有新建 hmset(k,v)
        if cart:
            redis_conn = get_redis_connection('cart')
            pl = redis_conn.pipeline()
            cart_key = 'cart_%s' % user.id
            pl.hmset(cart_key, cart)
            # 将保存勾选的列表加入redis的set中
            cart_selected_key = 'cart_selected_%s' % user.id
            if redis_cart_selected_add:
                # 先判断有没有数据在进行添加 -------sadd
                pl.sadd(cart_selected_key, *redis_cart_selected_add)

            if redis_cart_selected_remove:
                # 将没有勾选的在redis中set中删除 ---------srem
                pl.srem(cart_selected_key, *redis_cart_selected_remove)

            pl.execute()

        # 4. 清除cookie中购物车的数据

        response.delete_cookie('cart')


        return response
